package carte;

import org.xml.sax.*;

import graphes.Arc;
import graphes.Noeud;

import java.io.*;
import java.util.List;

public class MapHandler implements ContentHandler { // Interface a implementer
	String typeCourant; // Type de l'element en cours de reconnaissance
	List<Noeud> listeNoeuds;
	List<Arc> listeArcs;
	Noeud noeudCourant;
	Arc arcCourant;
	String ancetre;
	Carte carte;

	public MapHandler(Carte carte) {
		this.listeNoeuds = carte.getNoeuds();
		this.listeArcs = carte.getArcs();
		this.carte=carte;
		noeudCourant = null;
		arcCourant = null;
	}

	public void startDocument() throws SAXException {
	}

	public void endDocument() throws SAXException {
	}

	// Balise ouvrante d'element : nom dans localName
	public void startElement(String namespaceURI, String localName,
			String rawName, Attributes atts) throws SAXException {
		if (typeCourant != null) {
			ancetre = new String(typeCourant);
		}
		typeCourant = new String(localName);
		if (localName.equals("ville")) {
			noeudCourant = new Ville();
		}
		if (localName.equals("route")) {
			arcCourant = new Route();
		}
		if (localName.equals("autoroute")) {
			arcCourant = new Autoroute();
		} else { // autres elements...
		}
	}

	// Balise fermante : nom dans localName
	public void endElement(String namespaceURI, String localName, String rawName)
			throws SAXException {
		if (localName.equals("ville")) {
			listeNoeuds.add(noeudCourant);
		} else if (localName.equals("route")) {
			listeArcs.add(arcCourant);
		} else if (localName.equals("autoroute")) {
			listeArcs.add(arcCourant);
		} else
			// Autres elements eventuels...
		typeCourant = null;
	}

	// Contenu de l'element courant...
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		if (typeCourant != null && ancetre != null) {
			if (typeCourant.equals("docbase") || typeCourant.equals("ville")
					|| typeCourant.equals("route")
					|| typeCourant.equals("autoroute")) {
				// pas de contenu particulier
			} else { // Sinon element de description
				String contenu = new String(ch, start, length);
			}
			if (ancetre.equals("ville")) {
				if (typeCourant.equals("numero")) {
					noeudCourant.setNumero(new Integer(new String(ch, start,
							length)));
				}
				if (typeCourant.equals("nom")) {
					((Ville) (noeudCourant)).setNom(new String(ch, start,
							length));
				}
				if (typeCourant.equals("x")) {
					((Ville) (noeudCourant)).setPosX(Integer
							.parseInt(new String(ch, start, length)));
				}
				if (typeCourant.equals("y")) {
					((Ville) (noeudCourant)).setPosY(Integer
							.parseInt(new String(ch, start, length)));
				}
			}
			if (ancetre.equals("route") || ancetre.equals("autoroute")) {
				if (typeCourant.equals("numero")) {
					arcCourant.setNumero(new Integer(new String(ch, start,
							length)));
				}
				if (typeCourant.equals("nom")) {
					((Voie) (arcCourant))
							.setNom((new String(ch, start, length)));
				}
				if (typeCourant.equals("entre")) {
					Noeud debut = carte.findNoeud(new String(ch, start,
							length));
					arcCourant.setDebut(debut);
					debut.AjoutArcSortant(arcCourant);
				}
				if (typeCourant.equals("et")) {
					Noeud fin = carte.findNoeud(new String(ch, start,
							length));
					arcCourant.setFin(fin);
				}
				if (typeCourant.equals("distance")) {
					((Voie) (arcCourant)).setDistance((Double
							.parseDouble(new String(ch, start, length))));
				}
				if (typeCourant.equals("vitesse")) {
					((Voie) (arcCourant)).setVitesseMoyenne((Double
							.parseDouble(new String(ch, start, length))));
				}
				if (typeCourant.equals("ralentis")) {
					((Route) (arcCourant)).setRalentissements((Integer
							.parseInt(new String(ch, start, length))));
				}
				if (typeCourant.equals("peage")) {
					((Autoroute) (arcCourant)).setPrixPeage((Double
							.parseDouble(new String(ch, start, length))));
				}
			}
		}
	}



	// Sur le reste : NOP
	public void startPrefixMapping(String prefix, String uri) {
	}

	public void endPrefixMapping(String prefix) {
	}

	public void ignorableWhitespace(char[] ch, int start, int length)
			throws SAXException {
	}

	public void processingInstruction(String target, String data)
			throws SAXException {
	}

	public void skippedEntity(String name) throws SAXException {
	}

	public void setDocumentLocator(Locator locator) {
	}
}
